package com.wjw.java.others.object_;

/**
 * Object类是顶级父类,所有对象（包括数组）都实现了这个类的方法
 * 1.==和equals的对比：
 * ==判断基本数据类型,判断的是值是否相等
 * ==判断引用类型,判断的是引用地址是否相等,即判断是不是同一个对象
 *
 * equals：是Object类中的方法,默认判断的是地址是否相等
 * String类重写了Object类的equals方法,用于判断两个字符串的内容是否相等
 * Integer类也重写了Object类的equals方法,同于判断两个值是否相等
 * Integer:-128 ~ 127 有缓存,在这个区间,直接使用==比较没有问题,不在这个区间比较,Integer的地址就是新的内存地址
 * Integer比较应该使用equals
 */
public class Equals_ {
    public static void main(String[] args) {
        String str = "wjw";
        System.out.println("wjw".equals(str));//true

        Integer b = 128;
        Integer c = 128;
        System.out.println(b == c);//false [-128, 127]
        System.out.println(b.equals(c));//true

        User user1 = new User("wjw",30,"男");
        User user2 = new User("wjw",30,"男");
        System.out.println(user1 == user2);//false,比较的是地址值
        System.out.println(user1.equals(user2));//true,User类重写了Object的equals方法,比较各个属性是否一致,一致就为true
    }
}
class User{
    private String name;
    private int age;
    private String sex;

    /**
     * 重写Object类的equals方法,用于判断两个User对象
     */
    @Override
    public boolean equals(Object obj) {
        if(this == obj){//如果引用地址一致,true
            return true;
        }
        if(obj instanceof User){//如果类型为User,进行下一步判断
            //向下转换,因为我需要得到obj的各个属性值
            User user = (User)obj;
            return this.name.equals(user.name) &&
                   this.age == user.age &&
                   this.sex.equals(user.sex);
        }
        return false;//其他类型直接返回false
    }

    //getter、setter...
    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return this.age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSex() {
        return this.sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public User() {
    }

    public User(String name, int age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
}